// 移动构造函数和赋值
#include <iostream>
#include <string>
using namespace std;

class Example6
{

public:
    string *ptr;
    Example6(const string &str) : ptr(new string(str)) {
        cout << "one parameter constructor...\n";
    }
    ~Example6() { delete ptr; }
    // 移动构造函数，参数x不能是const Pointer&& x，
    // 因为要改变x的成员数据的值；
    // C++98不支持，C++0x（C++11）支持
    Example6(Example6 &&x) : ptr(x.ptr)
    {
        cout << "move constructor...\n";
        x.ptr = nullptr;
    }

    // move assignment
    Example6 &operator=(Example6 &&x)
    {
        cout << "move assignment...\n";
        delete ptr;
        ptr = x.ptr;
        x.ptr = nullptr;
        return *this;
    }
    // access content:
    const string &content() const { return *ptr; }
    // addition:
    Example6 operator+(const Example6 &rhs)
    {
        return Example6(content() + rhs.content());
    }
};
int main()
{
    Example6 foo("Exam"); // 构造函数
    // Example6 bar = Example6("ple"); // 拷贝构造函数

    Example6 bar(move(foo)); // 移动构造函数
                             // 调用move之后，foo变为一个右值引用变量，
                             // 此时，foo所指向的字符串已经被"掏空"，
                             // 所以此时不能再调用foo

    bar = bar + bar;         // 移动赋值，在这儿"="号右边的加法操作，
                             // 产生一个临时值，即一个右值
                             // 所以此时调用移动赋值语句

    if (foo.ptr != nullptr)
    {
        cout << "foo.ptr is not nullptr\n";
        cout << "foo's content: " << foo.content() << '\n';
    }else
    {
        cout << "foo.ptr is nullptr\n";
    }
    
    
    return 0;
}